package com.zr.util

import com.alibaba.fastjson.JSON
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import org.springframework.web.servlet.HandlerInterceptor
import java.util.concurrent.TimeUnit
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

//客户端每次请求都会传过来一个Token，使用这个拦截器类来拦截Token
@Component
class TokenInterceptor:HandlerInterceptor {
    //拦截器拦截客户端传过来的token，并看redis中是否存储了这个token标记的对象，如果存储了，就刷新该token的有效时间，允许继续操作。
    //若传过来的token为空或者redis中没有这个token标记的对象，那么就进行异常处理
    @Autowired
    private val redisUtils:RedisUtils?=null
    //将请求头向外部共享
    companion object{
        lateinit var sharedRequest: HttpServletRequest
    }
    override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
        val token=request.getHeader("Token")
        sharedRequest=request
        if(!token.isNullOrEmpty()){
            val obj=redisUtils?.get(token)
            if(obj!=null){
                redisUtils?.set(token,obj,15L,TimeUnit.MINUTES)
                return true
            }
        }
        //设置错误返回结果
        val result=Result(false,"请重新登录！",null)
        //设置浏览器状态
        response.status=HttpServletResponse.SC_UNAUTHORIZED
        response.contentType="application/json;charset=utf-8"
        //将错误信息展示在网页上
        //获得输出对象
        val outter=response.writer
        //将错误结果输出
        outter.write(JSON.toJSONString(result))
        //关闭输出流
        outter.flush()
        return false
    }
}